--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
nomadnet/Directory.py ae3d2ef802a1d66abb9739b323b4454826ee0583 (ae3d2ef8) Text, 6.63 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787RNS
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787time
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack
Tff7b72class T56d364DirectoryTb4b4b4:
Te6edf3ANNOUNCE_STREAM_MAXLENGTH Tff7b72= T79c0ff64
Te6edf3aspect_filter Tff7b72= Ta5d6ff"Ta5d6ffnomadnetwork.nodeTa5d6ff"
Tf0883e@staticmethod
Tff7b72def Td2a8ffreceived_announceTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3announced_identityTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Te6edf3app Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffNomadNetworkAppTff7b72.Td2a8ffget_shared_instanceTb4b4b4(Tb4b4b4)
Te6edf3destination_hash_text Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
T8b949e# TODO: REMOVE
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReceived node announce from: Ta5d6ff"Tff7b72+Te6edf3destination_hash_textTb4b4b4)
Te6edf3appTff7b72.Td2a8ffdirectoryTff7b72.Td2a8fflxmf_announce_receivedTb4b4b4(Te6edf3destination_hashTb4b4b4, Te6edf3app_dataTb4b4b4)
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3appTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdirectory_entries Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffannounce_stream Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffapp Tff7b72= Te6edf3app
Tff7b72selfTff7b72.Td2a8ffload_from_diskTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffsave_to_diskTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3packed_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3e Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]
Te6edf3packed_listTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3eTff7b72.Td2a8ffsource_hashTb4b4b4, Te6edf3eTff7b72.Td2a8ffdisplay_nameTb4b4b4, Te6edf3eTff7b72.Td2a8fftrust_levelTb4b4b4, Te6edf3eTff7b72.Td2a8ffhosts_nodeTb4b4b4)Tb4b4b4)
Te6edf3directory Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffentry_listTa5d6ff"Tb4b4b4: Te6edf3packed_listTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_streamTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffannounce_stream
Tb4b4b4}
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdirectorypathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3directoryTb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not write directory to disk. Then contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffload_from_diskTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdirectorypathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffappTff7b72.Td2a8ffdirectorypathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3unpacked_directory Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3unpacked_list Tff7b72= Te6edf3unpacked_directoryTb4b4b4[Ta5d6ff"Ta5d6ffentry_listTa5d6ff"Tb4b4b4]
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3entries Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3e Tff7b72in Te6edf3unpacked_listTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3eTb4b4b4) Tff7b72> T79c0ff3Tb4b4b4:
Te6edf3hosts_node Tff7b72= Te6edf3eTb4b4b4[T79c0ff3Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3hosts_node Tff7b72= Tff7b72False
Te6edf3entriesTb4b4b4[Te6edf3eTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4] Tff7b72= Te6edf3DirectoryEntryTb4b4b4(Te6edf3eTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3eTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3eTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3hosts_nodeTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirectory_entries Tff7b72= Te6edf3entries
T8b949e# TODO: Revert back to this simpler method instead of checking
T8b949e# for the old format
T8b949e# self.announce_stream = unpacked_directory["announce_stream"]
Tff7b72for Te6edf3entry Tff7b72in Te6edf3unpacked_directoryTb4b4b4[Ta5d6ff"Ta5d6ffannounce_streamTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Te6edf3entryTb4b4b4)Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3entryTb4b4b4) Tff7b72< T79c0ff4Tb4b4b4:
Te6edf3entryTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffannounce_streamTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load directory from disk. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8fflxmf_announce_receivedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Te6edf3timestamp Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_streamTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4(Te6edf3timestampTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffannounce_streamTb4b4b4) Tff7b72> Te6edf3DirectoryTff7b72.Td2a8ffANNOUNCE_STREAM_MAXLENGTHTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_streamTff7b72.Td2a8ffpopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffnode_announce_receivedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4)Tb4b4b4:
Te6edf3timestamp Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_streamTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4(Te6edf3timestampTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3app_dataTb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffannounce_streamTb4b4b4) Tff7b72> Te6edf3DirectoryTff7b72.Td2a8ffANNOUNCE_STREAM_MAXLENGTHTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_streamTff7b72.Td2a8ffpopTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffdisplay_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8ffdisplay_name
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffsimplest_display_strTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Te6edf3trust_level Tff7b72= Tff7b72selfTff7b72.Td2a8fftrust_levelTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72if Te6edf3trust_level Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffWARNING Tff7b72or Te6edf3trust_level Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffUNTRUSTEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3source_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8ffdisplay_name
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3source_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff>Ta5d6ff"
Tff7b72def Td2a8fftrust_levelTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3announced_display_nameTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72if Te6edf3announced_display_name Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8fftrust_level
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3entry Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3e Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3entryTb4b4b4]
Tff7b72if Te6edf3eTff7b72.Td2a8ffdisplay_name Tff7b72== Te6edf3announced_display_nameTb4b4b4:
Tff7b72if Te6edf3eTff7b72.Td2a8ffsource_hash Tff7b72!= Te6edf3source_hashTb4b4b4:
Tff7b72return Te6edf3DirectoryEntryTff7b72.Td2a8ffWARNING
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]Tff7b72.Td2a8fftrust_level
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3DirectoryEntryTff7b72.Td2a8ffUNKNOWN
Tff7b72def Td2a8ffrememberTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3entryTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3entryTff7b72.Td2a8ffsource_hashTb4b4b4] Tff7b72= Te6edf3entry
Tff7b72def Td2a8ffforgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTff7b72.Td2a8ffpopTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72def Td2a8fffindTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3source_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3source_hashTb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffis_knownTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsource_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3source_hashTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsource_identityTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffknown_nodesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3node_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3eh Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4:
Te6edf3e Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory_entriesTb4b4b4[Te6edf3ehTb4b4b4]
Tff7b72if Te6edf3eTff7b72.Td2a8ffhosts_nodeTb4b4b4:
Te6edf3node_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72return Te6edf3node_list
Tff7b72def Td2a8ffnumber_of_known_nodesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffknown_nodesTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffnumber_of_known_peersTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3lookback_secondsTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3unique_hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3cutoff_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3lookback_seconds
Tff7b72for Te6edf3entry Tff7b72in Tff7b72selfTff7b72.Td2a8ffannounce_streamTb4b4b4:
Tff7b72if Tff7b72not Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72in Te6edf3unique_hashesTb4b4b4:
Tff7b72if Te6edf3lookback_seconds Tff7b72== Tff7b72None Tff7b72or Te6edf3entryTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72> Te6edf3cutoff_timeTb4b4b4:
Te6edf3unique_hashesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tff7b72return Tffa657lenTb4b4b4(Te6edf3unique_hashesTb4b4b4)
Tff7b72class T56d364DirectoryEntryTb4b4b4:
Te6edf3WARNING Tff7b72= T79c0ff0x00
Te6edf3UNTRUSTED Tff7b72= T79c0ff0x01
Te6edf3UNKNOWN Tff7b72= T79c0ff0x02
Te6edf3TRUSTED Tff7b72= T79c0ff0xFF
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4, Te6edf3display_nameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3trust_levelTff7b72=Te6edf3UNKNOWNTb4b4b4, Te6edf3hosts_nodeTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3source_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsource_hash Tff7b72= Te6edf3source_hash
Tff7b72selfTff7b72.Td2a8ffdisplay_name Tff7b72= Te6edf3display_name
Tff7b72if Te6edf3display_name Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3display_name Tff7b72= Te6edf3source_hash
Tff7b72selfTff7b72.Td2a8fftrust_level Tff7b72= Te6edf3trust_level
Tff7b72selfTff7b72.Td2a8ffhosts_node Tff7b72= Te6edf3hosts_node
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to add invalid source hash to directoryTa5d6ff"Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────